home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / language / embedded / mcu / float09.arc / UTILIO.SA < prev    next >
Text File  |  1987-03-04  |  11KB  |  419 lines

  1. *
  2.   NAM  UTILIO
  3.   TTL  UTILITIES FOR IN/OUTPUT
  4. *
  5. *    DEFINE EXTERNAL REFERENCES
  6. *
  7.   XDEF    PWRTEN,LOG10X,ONE
  8. *
  9.   XREF    LNORM,FPMOVE,FMUL,DNORM1,SNORM,CLRES
  10.   XREF    TFRACT,COMP2
  11. *
  12. *    REVISION HISTORY:
  13. *    DATE      PROGRAMMER          REASON
  14. *
  15. *   23.MAY.80      G.WALKER & G.STEVENS      ORIGINAL
  16. *   05.JUN.80      G. STEVENS          FIX LOG2X
  17. *   11.JUN.80      G. STEVENS          FIX PWR TO ACCEPT "0"
  18. *                      AS AN ARGUMENT.
  19. *   14.JUL.80      G. STEVENS          CODE COMPACTION IN LOG2X
  20. *   17.JUL.80      G. WALKER          CODE SHRINK (XDEF ONE)
  21. *   29.JUL.80      G. WALKER          PWR CLEARS RESULT FOR FMUL
  22. *   31.JUL.80      G. STEVENS          FIX LOG2X FOR ZERO FRACTION
  23. *   03.AUG.80      G. STEVENS          FIX SIDE EFFECTS IN LOG10X
  24. *   27.OCT.80      G. STEVENS          FIX LOG2X SO X-REG. IS SAVED
  25. *   28.OCT.80      G. STEVENS          CHANGE LOG10(2) CONSTANT
  26. *   15.DEC.80      G.WALKER          CLEAR STIKY IN PWRMUL
  27. *
  28.   PAG
  29. **********************************************************
  30. *
  31. *     BELOW IS A TABLE CONTAINING FLOATING POINT POWERS
  32. *    OF 10^N FOR N= 1 - 27,54,108,216.    IF THIS TABLE IS
  33. *    TOO LARGE, THE POWERS OF 1 - 27 CAN BE REPLACED BY
  34. *    A MULTIPLY-BY-TEN LOOP.{
  35. *
  36. FPNUM MACR
  37.   FCB  $\0,$\1,$\2,$\3,$\4,$\5,$\6,$\7,$\8,$\9,$\A,$\B,$\C
  38.   ENDM
  39. *
  40. TEN216 FPNUM  0,02,CD,B9,A7,4A,06,37,CE,2E,E1,00,00
  41. TEN108 FPNUM  0,01,66,DA,01,EE,64,1A,70,8D,EA,00,00
  42. TEN54  FPNUM  0,00,B3,A7,0C,3C,40,A6,4E,6C,52,00,00
  43. TENTAB FPNUM  0,00,03,A0,00,00,00,00,00,00,00,00,00
  44.        FPNUM  0,00,06,C8,00,00,00,00,00,00,00,00,00
  45.        FPNUM  0,00,09,FA,00,00,00,00,00,00,00,00,00
  46.        FPNUM  0,00,0D,9C,40,00,00,00,00,00,00,00,00
  47.        FPNUM  0,00,10,C3,50,00,00,00,00,00,00,00,00
  48.        FPNUM  0,00,13,F4,24,00,00,00,00,00,00,00,00
  49.        FPNUM  0,00,17,98,96,80,00,00,00,00,00,00,00
  50.        FPNUM  0,00,1A,BE,BC,20,00,00,00,00,00,00,00
  51.        FPNUM  0,00,1D,EE,6B,28,00,00,00,00,00,00,00
  52.        FPNUM  0,00,21,95,02,F9,00,00,00,00,00,00,00
  53.        FPNUM  0,00,24,BA,43,B7,40,00,00,00,00,00,00
  54.        FPNUM  0,00,27,E8,D4,A5,10,00,00,00,00,00,00
  55.        FPNUM  0,00,2B,91,84,E7,2A,00,00,00,00,00,00
  56.        FPNUM  0,00,2E,B5,E6,20,F4,80,00,00,00,00,00
  57.        FPNUM  0,00,31,E3,5F,A9,31,A0,00,00,00,00,00
  58.        FPNUM  0,00,35,8E,1B,C9,BF,04,00,00,00,00,00
  59.        FPNUM  0,00,38,B1,A2,BC,2E,C5,00,00,00,00,00
  60.        FPNUM  0,00,3B,DE,0B,6B,3A,76,40,00,00,00,00
  61.        FPNUM  0,00,3F,8A,C7,23,04,89,E8,00,00,00,00
  62.        FPNUM  0,00,42,AD,78,EB,C5,AC,62,00,00,00,00
  63.        FPNUM  0,00,45,D8,D7,26,B7,17,7A,80,00,00,00
  64.        FPNUM  0,00,49,87,86,78,32,6E,AC,90,00,00,00
  65.        FPNUM  0,00,4C,A9,68,16,3F,0A,57,B4,00,00,00
  66.        FPNUM  0,00,4F,D3,C2,1B,CE,CC,ED,A1,00,00,00
  67.        FPNUM  0,00,53,84,59,51,61,40,14,84,A0,00,00
  68.        FPNUM  0,00,56,A5,6F,A5,B9,90,19,A5,C8,00,00
  69. TEN27  FPNUM  0,00,59,CE,CB,8F,27,F4,20,0F,3A,00,00
  70.   PAG
  71. **************************************************
  72. *
  73. *    PWRTEN --
  74. *     LEAVES AT 'RESULT,U' THE POWER OF TEN
  75. *    SPECIFIED AS A POSITIVE INTEGER IN DREG.
  76. *    PWRTEN USES THE GENERAL 'FMUL' ROUTINE, AND
  77. *    THUS BASHES  ARG1,ARG2, AND RESULT ON THE
  78. *    STACK FRAME.
  79. *
  80. *    ON ENTRY:
  81. *     D = POSITIVE INTEGER POWER OF TEN (1<=D<=512)
  82. *     OTHER REGS DON'T CARE.
  83. *    ON EXIT:
  84. *     ALL REGISTERS ARE UNCHANGED.
  85. *     RESULT,U = FLOATING-POINT POWER OF TEN
  86. *     ARG1 AND ARG2 DESTROYED.
  87. *
  88. *    LOCAL STORAGE:
  89. *     INITN -- 0=RESULT NOT INIT.; 1=IS INIT.
  90. *
  91. INITN SET 0
  92. *
  93. ALL    REG    D,CC,X,Y,U
  94. ALLPC  REG    D,CC,X,Y,U,PC
  95. *
  96. PWRTEN EQU *
  97.   PSHS #ALL
  98.   LEAS -1,S
  99.   CLR  INITN,S
  100.   IF  D,EQ,#0              IF POWER IS ZERO
  101.     LEAX  ONE,PCR         RETURN 10^0 = ONE
  102.     LEAY  RESULT,U
  103.     LBSR  FPMOVE          MOVE ONE TO THE RESULT
  104. *
  105.   ELSE
  106.     WHILE   D,GE,#216        WHILE POWER IS 216 OR MORE
  107.       LEAX TEN216,PCR        MULTIPLY IN 10^216
  108.       SUBD #216
  109.       BSR PWRMUL
  110.     ENDWH
  111.     IF    D,GE,#108        IF POWER IS 108 OR MORE
  112.       LEAX  TEN108,PCR            MULTIPLY IN 10^108
  113.       SUBD  #108
  114.       BSR  PWRMUL
  115.     ENDIF
  116.     IF    D,GE,#54         IF POWER IS 54 OR MORE
  117.       LEAX  TEN54,PCR         MULTIPLY IN 10^54
  118.       SUBD  #54
  119.       BSR  PWRMUL
  120.     ENDIF
  121.     IF    D,GE,#27         IF POWER IS 27 OR MORE
  122.       LEAX  TEN27,PCR        MULTIPLY IN 10^27
  123.       SUBD  #27
  124.       BSR  PWRMUL
  125.     ENDIF
  126.     IF    D,GT,#0        IF POWER IS STILL NON-ZERO
  127.       DECB            CALCULATE ADDRESS OF TABLE
  128.       LDA  #13               POWER OF TEN
  129.       MUL
  130.       LEAX  TENTAB,PCR
  131.       LEAX  D,X
  132.       BSR  PWRMUL          MULTIPLY IN VALUE FROM TABLE
  133.     ENDIF
  134. *
  135.   ENDIF
  136.   LEAS 1,S
  137.   PULS #ALLPC
  138. *
  139. *****************************************************
  140. *
  141. *    PWRMUL --
  142. *     USED BY 'PWRTEN' TO MULTIPLY THE RESULT BY
  143. *    EACH NEW POWER OF TEN.  IF THE RESULT IS NOT
  144. *    INITIALIZED,  THEN THE APPROPRIATE POWER OF TEN
  145. *    IS MOVED FROM THE TABLE TO THE RESULT,  ELSE
  146. *    THE RESULT IS MULTIPLIED BY THE APPORPRIATE TABLE
  147. *    ENTRY.
  148. *
  149. *    ON ENTRY:
  150. *     X = APPROPRIATE POWER OF TEN IN TABLE
  151. *     OTHER REGS DON'T CARE.
  152. *
  153. *    ON EXIT:
  154. *     D,U,S ARE UNCHANGED.
  155. *     OTHER REGS ARE BASHED.
  156. *
  157. PWRMUL EQU *
  158.   IFTST  (INITN+2,S),EQ,#0    IF RESULT IS NOT INITIALIZED
  159.     LEAY RESULT,U         MOVE TABLE VALUE TO RESULT
  160.     LBSR FPMOVE
  161.     COM  INITN+2,S         SHOW RESULT AS INITIALIZED
  162.   ELSE
  163.     LEAY  ARG1,U          ELSE MULTIPLY RESULT BY TABLE
  164.     LBSR  FPMOVE          VALUE
  165.     LEAX  RESULT,U
  166.     LEAY  ARG2,U
  167.     LBSR  FPMOVE
  168.     PSHS  D
  169.     LDB  #CLRFRC        CLEAR RESULT FRACTION
  170.     LBSR CLRES
  171.     CLR  STIKY,U        ZERO STICKY BYTE INTO FMUL
  172.     LBSR  FMUL            MULTILPY POWERS OF TEN
  173.     PULS  D
  174.   ENDIF
  175. *
  176.   RTS
  177. *
  178. *
  179. * HERE IS A FLOATING ONE CONSTANT. NOTE THIS CONSTANT EXISTS
  180. *   IN 'OUTS.SA' AND PERHAPS OTHER MODULES AS WELL.
  181. *   IT IS 'XDEF'ED HERE AND SHOULD BE XREF'ED IN
  182. *   THE OTHER MODULES TO AVOID DUPLICATE CODE.
  183. *
  184. ONE FCB  00,00,00,$80,00,00
  185.     FCB  00,00,00,00,00,00
  186.     FCB  TYNORM
  187. *
  188.   PAG
  189. *******************************************************
  190. *
  191. *    HERE IS THE FUNCTION LOG 10 (X) WHICH IS
  192. * USED WITH THE INS AND OUT ROUTINES TO THE
  193. * FLOATING PT. PACKAGE.
  194. *
  195. *
  196. * PROCEDURE  LOG2X
  197. *
  198. *    LOG2X CHANGES A FLOATING OPERAND, F , TO ITS
  199. * LOGARITHM TO THE BASE 2 BY THE METHOD IN YOUNG AND
  200. * GREGORY, A SURVEY OF NUMERICAL MATHEMATICS,VOL. 1,
  201. * PP. 64-65
  202. *
  203. *  ON ENTRY: X - POINTS TO THE OPERAND IN THE STACK FRAME
  204. *
  205. *  ON EXIT: X - POINTS TO THE LOG2X OF THE INPUT OPERAND
  206. *        ON THE STACK FRAME.
  207. *
  208. *
  209. SINBND EQU  05
  210. DBLBND EQU  07
  211. *
  212. *
  213. LOG2X EQU  *
  214. *
  215.  PSHS  X,Y,D         SAVE CALLER'S REGISTERS
  216. *
  217.  LDB  RPREC,U          GET PRECISION INDEX
  218. *
  219. * SHIFT FRACTION TO THE LEFT ONCE TO YIELD FRACTIONAL
  220. * PART
  221. *
  222.  ANDCC    #NC       CLEAR CARRY
  223.  LSHIFT  FRACT,X,7
  224. *
  225. * NOW SET THE SIGN OF THE LOG2X RESULT TO THE SIGN
  226. * OF THE EXPONENT SINCE THE EXPONENT IS ALMOST THE
  227. * CORRECT VALUE ALREADY
  228. *
  229.  LDA EXP,X
  230.  ANDA #BIT7         SIGN BIT
  231.  STA  SIGN,X
  232. *
  233. * CONVERT EXPONENT FROM  BINARY INTEGER TO A SIGN
  234. * AND MAGNITUDE FLOATING INTEGER
  235. *
  236.  IFCC  LT         EXPONENT NEGATIVE
  237. *
  238. * TAKE 2'S COMPLEMENT OF THE EXPONENT
  239. *
  240.    COM    EXP,X
  241.    COM    EXP+1,X
  242. *
  243. * SINCE EXPONENT IS NEGATIVE, SET UP A 2'S COMPLEMENT
  244. * ADD BETWEEN THE EXPONENT AND THE FRACTIONAL PART OF
  245. * THE SIGNIFICAND. I.E. -E.0 + 0.FFF = -(E.0 - 1 +
  246. * (1 - 0.FFF)) UNLESS THE FRACTION IS ZERO IN WHICH
  247. * CASE NOTHING IS DONE.
  248. *
  249. * CHECK FOR FRACTION = ZERO
  250. *
  251.    LBSR  TFRACT
  252.    IFCC  EQ         FRACTION = ZERO
  253.      LDD  EXP,X      CORRECT FCOMPLEMENT
  254.      ADDD  #01
  255.      STD  EXP,X
  256. *
  257. *
  258. * CALCULATE (1 - 0.FFF) WHICH IS REALLY THE 2'S COMP.
  259. * OF (0.FFF)
  260. *
  261.    ELSE
  262.      LEAX  FRACT,X
  263.      LDB  #COMPSZ     NO OF BYTES
  264.      LBSR  COMP2
  265.      LEAX  -FRACT,X      RESTORE X-REG
  266. *
  267.    ENDIF         FRACTION = ZERO
  268. *
  269.  ENDIF             EXPONENT NEGATIVE
  270. *
  271. * COMBINE THE EXPONENT AND FRACTION INTO ONE FLOATING
  272. * VALUE I.E. JUST SHIFT THE EXPONENT INTO THE SIGNIFICAND
  273. * AND SET THE CORRECT RESULTING EXPONENT.
  274. *
  275.  LDB  RPREC,U         PRECISION INDEX
  276.  IF  B,EQ,#SIN         SINGLE PRECISION
  277.    LEAY  SINBND,X    BYTE BOUNDARY SINGLE PREC.
  278. *
  279.  ELSE             DOUBLE PRECISION
  280.    LEAY  DBLBND,X    BYTE BOUNDARY DOUBLE PREC.
  281. *
  282.    LDA    DBLBND+2,X   LSBYTE FRACTION
  283.    STA    DBLBND+4,X
  284. *
  285.  ENDIF             SINGLE PRECISION
  286. *
  287. * MOVE REST OF SIGNIFICAND OVER 2 BYTES
  288. *
  289.  PSHS  X
  290.  WHILE    Y,GE,(,S++)
  291.    MOVD  (0,Y),(2,Y)
  292.    LEAY  -2,Y
  293.    PSHS  X
  294. *
  295.  ENDWH
  296. *
  297. * SET CORRECT EXPONENT I.E. EXPSIZ -1 = 15
  298. *
  299.  LDD  #EXPSIZ-1
  300.  STD  EXP,X
  301. *
  302. * NOW NORMALIZE THE RESULTING FLOATING VALUE
  303. *
  304.  LBSR  LNORM
  305. *
  306.  PULS  X,Y,D,PC       RESTORE AND RETURN
  307.  PAG
  308. ******************************************************
  309. *
  310. * PROCEDURE LOG10X
  311. *
  312. *    LOG10X COMPUTES THE LOG TO THE BASE 10 OF
  313. * A FLOATING OPERAND, F. THE LOG10(X) IS CALC-
  314. * ULATED AS DESCRIBED IN THE "SPECIFICATION"
  315. * BY JEROME COONEN BY USING THE RELATION:
  316. *
  317. *   LOG10(X) = LOG2(X) * LOG10(2)
  318. *
  319. * ON ENTRY: X - POINTS TO THE ARGUMENT ON THE
  320. *        STACK FRAME.
  321. *
  322. * ON EXIT: RESULT,U CONTAINS LOG10(X) OF THE
  323. *      INPUT ARGUMENT
  324. *
  325. * LOCAL EQUATE
  326. COMPSZ EQU  08
  327. *
  328. LOG10X EQU  *
  329. *
  330.  PSHS  X,Y,D           SAVE CALLERS REGS.
  331. *
  332.  BSR  LOG2X          FIND LOG2(X)
  333. *
  334. * CHECK FOR A ZERO RESULT FROM LOG2(X), IF SO THEN
  335. * THEN RETURN A ZERO AND TERMINATE CALCULATIONS.
  336. *
  337.  LBSR  TFRACT          TEST FOR ZERO
  338.  IFCC  EQ
  339.    LDD    #$8000
  340.    STD    EXP,X          SET ZERO EXPONENT
  341.    CLR    SIGN,X          MAKE RESULT POSITIVE
  342.    LDA    #TYZERO
  343.    STA    TYPE,X          SET TYPE FOR ZERO
  344. *
  345. * ELSE CONTINUE AS PLANNED
  346. *
  347.  ELSE L
  348. *
  349. * TEMPORARILY PERFORM ALL CALCULATIONS IN EXTENDED
  350. *
  351.    LDA    RPREC,U          PRECISION INDEX
  352.    PSHS  A             SAVE IT
  353.    LDA    #EXT             EXTENDED PRECISION INDEX
  354.    STA    RPREC,U          REPLACE INDEX
  355. *
  356. * NOW FIND OUT WHERE TO PUT THE LOG10(2) CONSTANT;
  357. * THIS DEPENDS ON WHERE LOG2(X) IS. NEXT MOVE THE
  358. * CONSTANT INTO THE STACK FRAME.
  359. *
  360.    LEAY  ARG1,U         TRY ARG1
  361.    PSHS  Y
  362.    IF  X,EQ,(,S++)        IF ALREADY TAKEN
  363.      LEAY  ARG2,U        USE ARG2
  364. *
  365.    ENDIF
  366. *
  367. *
  368.    LEAX  LOG102,PCR        LOG10(2) CONSTANT
  369.    LBSR  FPMOVE           BRING IT IN
  370. *
  371. * TEMPORARILY CHANGE THE ROUND MODE TO NEAREST;
  372. * FCMULT ROUNDS ITS RESULT AT THE END OF THE OPERATION
  373. *
  374.    LDA    [PFPCB,U]        PRESENT CTRL. BYTE
  375.    PSHS  A            SAVE IT
  376. *
  377.    ANDA  #$FF-(BIT1+BIT2)   REMOVE RND. MODE
  378.    ORA    #RN            REPLACE WITH NEAREST
  379.    STA    [PFPCB,U]        REPLACE CTRL. BYTE
  380. *
  381. * PERFORM MULTIPLICATION: LOG2(X) * LOG10(2)
  382. *  = LOG10(X)
  383. *
  384.    LEAX  RESULT,U        ZERO OUT RESULT
  385.    LDB    #CLRALL
  386.    LBSR  CLRES
  387. *
  388.    LBSR  FMUL
  389. *
  390. * RESTORE OID ROUNDING MODE IN THE CONTROL BYTE OF
  391. * THE FPCB
  392. *
  393.    PULS  D            OLD CTRL. BYTE
  394.    STA    [PFPCB,U]        RESTORE IT
  395. *
  396. * RESTORE PPREC PRECISION INDEX
  397. *
  398.    STB    RPREC,U          REPLACE IT
  399. *
  400. * FINALLY MOVE    LOG10X    BACK TO THE LOCATION
  401. * OF THE ORIGINAL INPUT ARGUMENT.
  402. *
  403.    LEAX  RESULT,U           SOURCE
  404.    LDY    2,S               POINTER TO ORIGINAL ARGUMENT
  405.    LBSR  FPMOVE            MOVE IT!
  406. *
  407. *
  408.  ENDIF                 LOG2X EQUALS ZERO
  409. *
  410.  PULS  X,Y,D,PC       RESTORE AND RETURN
  411. *
  412. *
  413. * HERE IS THE LOG10(2) CONSTANT
  414. *
  415. LOG102 FCB  00,$FF,$FE,$9A,$20,$9A
  416.        FCB  $84,$FB,$CF,$F7,$99,00
  417.        FCB  TYNORM
  418. *
  419.